home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xwall / xdm.patch < prev    next >
Text File  |  1995-06-20  |  3KB  |  98 lines

  1. Also, I thought that I would share my changes to xdm.  I have changed
  2. xdm to write an authorization record for root.  I feel that this does
  3. not compromise security at all.  root could also setuid to the user
  4. to gain access to the display.  I have written a daemon that catches
  5. console message and displays them in a window.  Also, we have a system
  6. that submits jobs on idle workstations.  This system can connect to
  7. the X display to check the idle time.  Anyway, here is my patch to xdm:
  8.  
  9. NOTE: This patch applies to X11R4 xdm.  It is not required for X11R5 xdm.
  10.  
  11.  
  12. *** /tmp/,RCSt1a23628    Sun Jul  8 14:39:22 1990
  13. --- auth.c    Wed Jun 13 14:03:25 1990
  14. ***************
  15. *** 201,206 ****
  16. --- 201,207 ----
  17.           ret = TRUE;
  18.       fclose (auth_file);
  19.       }
  20. +     SetRootAuthorization (d, auth);
  21.       return ret;
  22.   }
  23.   
  24. ***************
  25. *** 778,781 ****
  26. --- 779,849 ----
  27.       }
  28.       }
  29.       Debug ("done SetUserAuthorization\n");
  30. + }
  31. + SetRootAuthorization (d, auth)
  32. + struct display    *d;
  33. + Xauth        *auth;
  34. + {
  35. +     FILE    *old, *new;
  36. +     char    *home_name;
  37. +     char    new_name[1024];
  38. +     int    lockStatus;
  39. +     Xauth    *entry;
  40. +     struct stat    statb;
  41. +     Debug ("SetRootAuthorization\n");
  42. +     if (auth) {
  43. +     lockStatus = LOCK_ERROR;
  44. +     home_name = "/.Xauthority";
  45. +     Debug ("XauLockAuth %s\n", home_name);
  46. +     lockStatus = XauLockAuth (home_name, 1, 2, 10);
  47. +     Debug ("Lock is %d\n", lockStatus);
  48. +     if (lockStatus == LOCK_SUCCESS) {
  49. +         if (!openFiles (home_name, new_name, &old, &new)) {
  50. +         Debug ("openFiles failed\n");
  51. +         XauUnlockAuth (home_name);
  52. +         lockStatus = LOCK_ERROR;
  53. +         }    
  54. +     }
  55. +     if (lockStatus != LOCK_SUCCESS) {
  56. +         Debug ("can't lock auth file %s\n", home_name);
  57. +         LogError ("can't lock authorization file %s\n", home_name);
  58. +         return;
  59. +     }
  60. +     initAddrs ();
  61. +     if (d->displayType.location == Local)
  62. +         writeLocalAuth (new, auth, d->name);
  63. +     else
  64. +         writeRemoteAuth (new, auth, d->peer, d->peerlen, d->name);
  65. +     if (old) {
  66. +         if (fstat (fileno (old), &statb) != -1)
  67. +         chmod (new_name, (int) (statb.st_mode & 0777));
  68. +         while (entry = XauReadAuth (old)) {
  69. +         if (!checkAddr (entry->family,
  70. +                    entry->address_length, entry->address,
  71. +                    entry->number_length, entry->number))
  72. +         {
  73. +             Debug ("Saving an entry\n");
  74. +             dumpAuth (entry);
  75. +             writeAuth (new, entry);
  76. +         }
  77. +         XauDisposeAuth (entry);
  78. +         }
  79. +         fclose (old);
  80. +     }
  81. +     doneAddrs ();
  82. +     fclose (new);
  83. +     if (unlink (home_name) == -1)
  84. +         Debug ("unlink %s failed\n", home_name);
  85. +     if (link (new_name, home_name) == -1) {
  86. +         Debug ("link failed %s %s\n", new_name, home_name);
  87. +         LogError ("Can't move authorization into place\n");
  88. +     } else {
  89. +         Debug ("new is in place, go for it!\n");
  90. +         unlink (new_name);
  91. +     }
  92. +     XauUnlockAuth (home_name);
  93. +     }
  94. +     Debug ("done SetRootAuthorization\n");
  95.   }
  96.